package com.ylsk.flowable.service;

import com.ylsk.common.core.domain.AjaxResult;
import com.ylsk.common.enums.OperateTypeEnum;
import com.ylsk.flowable.domain.vo.Attachment;
import com.ylsk.flowable.domain.vo.Page;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * FileName IWorkFlowService
 * Description 流程运行和历史服务接口
 * create 2018-08-15 上午 11:35
 * version V1.0
 */
public interface IWorkFlowService {

    /***
     * @methodname supendProcessInstanceByTaskId
     * @Description 挂起流程实例
     * @param taskId 任务id
     * @throws
     */
    AjaxResult supendProcessInstanceByTaskId(String taskId);


    /***
    * @methodname activateProcessInstanceByTaskId
    * @Description 激活流程实例
    * @create 2018/8/15 0015 上午 11:36
    * @param taskId 任务id
    */
    AjaxResult activateProcessInstanceByTaskId(String taskId);

    /***
    * @methodname supendProcessInstanceByBusinessId
    * @Description 挂起流程实例
    * @author zjh
    * @create 2018/8/15 0015 上午 11:38
    * @param businessId  业务id
    * @throws
    */
    AjaxResult supendProcessInstanceByBusinessId(String businessId);


    /***
    * @methodname activateProcessInstanceByBusinessId
    * @Description 激活流程实例
    * @author zjh
    * @create 2018/8/15 0015 上午 11:39
    * @param businessId 业务id
    * @throws
    */
    AjaxResult activateProcessInstanceByBusinessId(String businessId);

    /***
    * @methodname getTodoTasksByPage
    * @Description 查询待办任务
    * @author zjh
    * @create 2018/8/15 0015 上午 11:40
    * @param userId 用户id
     *@param page 分页 {@link Page}
    * @throws {如果有异常说明请填写}
    */
    AjaxResult listTodoTasksByPage(String userId, Page page);


    /***
    * @methodname getDoneTaskByPage
    * @Description 查询已办任务
    * @author Administrator
    * @create 2018/8/15 0015 上午 11:42
    * @param userId 用户id
     *@param page 分页 {@link Page}
    * @throws {如果有异常说明请填写}
    */
    AjaxResult listDoneTaskByPage(String userId, Page page);

    /***
    * @methodname getRunningProcessinstance
    * @Description 查询某个用户的发起的流程(包含已经完成和未完成的)
    * @param userId 用户id
     * @param page 分页信息 {@link Page}
     * @param type 1.完成,2 未完成
    * @throws
    */
    AjaxResult listRunningProcessinstance(String userId, Page page, String type);


    /***
    * @methodname getHistoricTaskInstance
    * @Description 得到某个流程实例的任务列表(包括完成和未完成的)
    * @author zjh
    * @create 2018/8/15 0015 上午 11:49
    * @param processInstanceId 流程实例id
     *@param type 1.完成,2 未完成
    * @throws
    */
    AjaxResult listHistoricTaskInstance(String processInstanceId, String type);


    /***
    * @methodname startProcessInstanceByKey
    * @Description 启动流程
    * @author zjh
    * @create 2018/8/15 0015 上午 11:52
    * @param key 流程key
     *@param  businessId 业务id
     *@param  params 流程参数
     *@param  businessObj 业务对象
     *@param  userId 用户id
    * @throws Exception 启动流程异常
    */
    AjaxResult startProcessInstanceByKey(String key, String businessId, Map<String, Object> params,
                                       Object businessObj, String userId) throws Exception;

    /***
    * @methodname startProcessInstanceById
    * @Description 启动流程
    * @author zjh
    * @create 2018/8/15 0015 上午 11:55
    * @param id  流程定义id
     *@param  businessId 业务id
     *@param  params 流程参数
     *@param  businessObj 业务对象
     *@param  userId 用户id
    * @throws Exception 启动流程异常
    */
    AjaxResult startProcessInstanceById(String id, String businessId, Map<String, Object> params, Object businessObj, String userId) throws Exception;



    /***
    * @methodname getPartakeByPage
    * @Description 得到参与的流程
    * @author zjh
    * @create 2018/8/15 0015 下午 1:31
    * @param userId 用户id
     *@param  page 分页参数 {@link Page}
     *@param  type 类型1.完成,2.未完成
    * @throws
    */
    AjaxResult listPartakeByPage(String userId, Page page, String type);



    /***
    * @methodname completeTask
    * @Description 完成任务
    * @author zjh
    * @create 2018/8/15 0015 下午 1:40
    * @param taskId 任务id
     *@param  params 任务参数
     *@param  commet 任务批注
     *@param  attachements 附件集合
     *@param  userId 用户id
     *@param  businessObj 业务对象
     *@param  operateTypeEnum 操作类型
    * @throws Exception 完成任务异常
    */
    AjaxResult completeTask(String taskId, Map<String, Object> params, String commet, List<Attachment> attachements, Object businessObj, String userId, OperateTypeEnum operateTypeEnum) throws Exception;


    /***
    * @methodname batchCompleteTask
    * @Description 批量完成任务
    * @author zjh
    * @create 2018/8/15 0015 下午 1:43
    * @param taskIds 任务id集合
     *@param  params 任务参数
     *@param  commet 任务批注
     *@param  userId 用户id
    * @throws Exception
    */
    AjaxResult batchCompleteTask(List<String> taskIds, Map<String, Object> params, String commet, String userId) throws Exception;


    /***
    * @methodname completeDelegateTask
    * @Description 完成委托任务
    * @author zjh
    * @create 2018/8/15 0015 下午 1:45
    * @param taskId 任务id
     * params 任务变量
     * commet 任务批注
     * attachements 任务附件
     * userId 用户id
    */
    AjaxResult completeDelegateTask(String taskId, Map<String, Object> params, String commet, List<Attachment> attachements, String userId);


    /***
    * @methodname jumpAndCompleteTask
    * @Description 跳转并完成任务
    * @author zjh
    * @create 2018/8/15 0015 下午 1:48
    * @param taskId 任务id
     *@param  params 任务变量
     *@param  commet 任务批注
     *@param  desActivityId 目标节点id
     *@param  toStartActivity 是否跳转到开始节点
     *@param  attachements 任务附件
     *@param  userId 用户id
    */
    AjaxResult jumpAndCompleteTask(String taskId, Map<String, Object> params, String commet, String desActivityId, boolean toStartActivity,
                                 List<Attachment> attachements, String userId);


    /***
    * @methodname delegateTask
    * @Description 代理任务
    * @author zjh
    * @create 2018/8/15 0015 下午 1:51
    * @param taskId 任务id
     *@param  delegateUserId 代理人id
    * @throws Exception 任务代理异常
    */
    AjaxResult delegateTask(String taskId, String delegateUserId) throws  Exception;


    /***
    * @methodname stopProcessInstance
    * @Description 终止流程
    * @author zjh
    * @create 2018/8/15 0015 下午 1:54
    * @param taskId 任务id
     *@param  reson 终止原因
    * @throws Exception 停止流程异常
    */
    AjaxResult stopProcessInstance(String taskId, String reson) throws  Exception;


    /**
     * 结束流程
     * @param processInstanceID 流程实例ID
     * @param reson 结束原因
     * @return
     * @throws Exception
     */
    AjaxResult stopProcessInstanceByProcessInstanceId(String processInstanceID, String reson) throws  Exception;

    /***
    * @methodname queryTodoTaskCount
    * @Description 查询待办的数量
    * @author zjh
    * @create 2018/8/15 0015 下午 1:56
    * @param userId 用户id
    * @throws
    */
    AjaxResult queryTodoTaskCount(String userId);


    /***
    * @methodname getTaskByUserIdAndProcessInstanceId
    * @Description 根据当前登录人ID和流程实例ID得到待办任务
    * @author zjh
    * @create 2018/10/4 0004 下午 4:31
    * @param userId 用户ID
     *@param  processInstanceId 流程实例ID
    * @throws {如果有异常说明请填写}
    */
    AjaxResult getTaskByUserIdAndProcessInstanceId(String userId, String processInstanceId);



    /***
    * @methodname updateVariableForProcessInstance
    * @Description 更新流程实例的变量
    * @author zjh
    * @create 2018/12/17 0017 上午 11:47
    * @param processInstanceId 流程实例ID
     *@param  varObj 变量对象
    */
    AjaxResult updateVariableForProcessInstance(String processInstanceId, Object varObj);


    /**
     * 得到某个流程定义有任务节点的待办数量
     * @param processDefinitionId 流程定义ID
     * @param userId 用户ID
     * @return
     */
    AjaxResult listTodoTaskCountOfTaskNodeWithProcessDefinition(String processDefinitionId, String userId);


    /***
    * @methodname getTodoTaskCount
    * @Description 查询待办数量
    * @author zjh
    * @create 2019/1/23 0023 下午 2:27
    * @param userId 用户ID
    * @throws
    * @return com.greatechoa.workflow.management.entity.vo.Response
    */
    AjaxResult getTodoTaskCount(String userId);

    /**
     * @methodname getFinishedTaskByInstanceId
     * @Description 根据流程实例ID集合 查询已是否已经执行完成
     * @author cpstory
     * @param instanceIdSet
     */
    AjaxResult getFinishedTaskByInstanceId(Set<String> instanceIdSet);

    /**
     * @methodname sendMsgToPush
     * @Description 向挂起的流程发送配置的消息，推动节点向下执行
     * @author cpstory
     * @param msg
     * @param instanceId
     */
    AjaxResult sendMsgToPushNode(String msg, String instanceId) throws Exception;


    /**
     * 根据流程实例得到当前待办任务
     * @param userId 用户ID
     * @param processInstanceIds 流程实例ID集合
     * @return
     */
    AjaxResult listTodoTasksByPIdsAndUserId(List<String> processInstanceIds, String userId);


    /**
     * 驳回任务
     * @param taskId
     * @param destActId
     * @param commet
     * @param params
     * @param userId
     * @return
     */
    AjaxResult moveCurrentTaskToReApplyActId(String taskId, String destActId, String commet, Map<String, Object> params, String userId);



    AjaxResult getUserTaskByBusinessId(String businessId);

}
